// 导入express框架
const express = require('express')
// 导入path模块处理路径
const path = require('path')
// 导入ejs模块处理模板渲染
const ejs = require('ejs')
// 处理post请求 application/x-www-form-enurlcoded
const bodyParser = require('body-parser')
// 引入jwt token工具
const JwtUtil = require('./utils/jwt')
// 发送邮件工具
const emailApi = require('./utils/emailApi')
// 解决跨域模块
const cors = require('cors')

// 创建app程序
const app = express()
// 跨域资源共享 (Cross-origin resource sharing)
app.use(cors());
// 解析json编码数据
app.use(bodyParser.json())
// 解析url编码的数据
app.use(bodyParser.urlencoded({ extended: false }))

/*
*
*  页面管理
*  负责部分页面的数据渲染
*
*/
// 允许访问主页
app.get('/', (req, res) => {
    res.render('home')
})
app.get('/login', (req, res) => {
    res.render('login')
})
app.get('/register', (req, res) => {
    res.render('register')
})
/*
*
*  路由管理
*  负责业务处理
*
*/

// 用户路由
app.use('/user', require('./router/user/index'))

// 管理员路由
app.use('/admin', require('./router/admin/index'))

// 导航路由
app.use('/navigate', require('./router/navigate/index'))

// 广告路由
app.use('/advert', require('./router/advert/index'))

// 内容路由
app.use('/content', require('./router/content/index'))

// 题目路由
app.use('/topic', require('./router/topic/index'))

// 收藏题目路由
app.use('/collect/topic', require('./router/collect/topic'))
app.use('/collect/content', require('./router/collect/content'))

// 文章路由
app.use('/article', require('./router/article/index'))

// 签到路由
app.use('/signin2', require('./router/signin2/index'))

// 学习次数路由
app.use('/practice', require('./router/practice/index'))

// 评论路由
app.use('/comment/article', require('./router/comment/article'))
app.use('/comment/content', require('./router/comment/content'))

// 回复路由
app.use('/reply/article', require('./router/reply/article'))
app.use('/reply/content', require('./router/reply/content'))

/*
*
*  可重复利用的公共接口
*  
*
*/
// 发送邮件
app.get('/sendEmail', async function (req, res) {
    let email = req.query.email;
    // console.log('email:',email)
    let rep = /^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/;
    if (rep.test(email)) {
        emailApi.Email.getEmailCode(email)
            .then(
                () => {
                    res.send({
                        code: 200,
                        msg: "验证码发送成功"
                    })
                }
            )
    } else {
        res.send({
            code: -1,
            msg: "邮箱格式不正确"
        })
    }
})

// 判断用户登录在线
app.post('/logged', function (req, res) {
    // 请求需要进行token校验 
    let token = req.body.token
    let jwt = new JwtUtil(token)
    let result = jwt.verifyToken()
    // 接收前端的参数
    if (result == 'err') {
        res.send({
            code: -1,
            msg: '登录已过期,请重新登录'
        })
    } else {
        res.send({
            code: 200,
            msg: 'online'
        })
    }
})

// 测试
app.get('/test',(req,res)=>{
    res.send({
        code: 200,
        msg: '测试成功'
    })
})

// 设置渲染视图模板的目录
app.set('views', path.join(__dirname, 'views'))
// 设置项目的视图引擎
app.engine('html', ejs.__express)
// 模板类型为html格式
app.set('view engine', 'html')
// 设置静态资源的目录
app.use(express.static('public'))
// 404 提示
app.get('*', (req, res) => {
    res.render('404')
})

// catch 404 and forward to error handler
// app.use(function (req, res, next) {
//     var err = new Error('Not Found');
//     err.status = 404;
//     next(err);
// })
// 监听后台端口
const port = process.env.PORT || 5000
const host = process.env.HOST || ''
// 服务器启动默认端口为 3000,若不想使用 3000 端口,可使用以下命令: Mac/Linux
// $ PORT=4000 node app.js
// windows 下使用 git-bash 或者 cmder 等终端执行以下命令:
// set PORT=4000 && node app.js
app.listen(port, () => {
    console.log("服务端启动成功!")
    console.log("http://127.0.0.1:5000")
    console.log("http://localhost:5000")
})